home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok40.lha / DoubleBuffering / DoubleBuffering.mod < prev    next >
Text File  |  1993-08-15  |  7KB  |  220 lines

  1. (***************************************************************************
  2.   :Program.       DoubleBuffering.mod
  3.   :Author.        Jürgen Zimmermann
  4.   :Address.       Ringstraße 6, 6719 Altleiningen, West-Germany
  5.   :Phone.         06356/1456
  6.   :ShortCut.      [JnZ]
  7.   :Support.       -
  8.   :Version.       1.0
  9.   :Date.          28. October 1989
  10.   :Copyright.     PD
  11.   :Language.      MODULA-II
  12.   :Translator.    M2Amiga 3.3d
  13.   :Contents.      Modul zur einfachen Handhabung von DoubleBuffering-Views
  14.   :Contents.      zur flimmerfreien Darstellung bewegter Grafik
  15.   :Remark.        Ich würde mich sehr über Kontakt mit anderen M2Amiga-Usern
  16.   :Remark.        und MIDI-Freaks freuen.
  17.   :Usage.         Siehe "DoubleBuffering.dok"
  18. ****************************************************************************)
  19.  
  20. IMPLEMENTATION MODULE DoubleBuffering;
  21.  
  22. FROM SYSTEM    IMPORT ADR, ADDRESS;
  23.  
  24. FROM Graphics  IMPORT SetAPen, SetDrMd, RectFill, jam1, Move, DrawModes,
  25.                       DrawModeSet, ViewModeSet, ViewModes, RastPort,
  26.                       RastPortPtr, GfxBase, GfxBasePtr, View, ViewPtr,
  27.                       ViewPort,ViewPortPtr,AllocRaster, MrgCop,MakeVPort,
  28.                       InitBitMap, LoadView, InitRastPort, WaitTOF, GetColorMap,
  29.                       FreeColorMap,FreeRaster,FreeVPortCopLists,FreeCprList,
  30.                       BitMap, BitMapPtr, RasInfo, CprlistPtr, Cprlist,
  31.                       InitVPort, InitView;
  32.  
  33. FROM Arts      IMPORT Assert;
  34.  
  35. IMPORT Graphics;
  36.  
  37.  
  38. VAR (* Variable für den View!!! *)
  39.     DualBitMap        : ARRAY[0..1] OF BitMap;
  40.     DualRastPort      : ARRAY[0..1] OF RastPort;
  41.     DualVPort         : ViewPort;
  42.     DualView          : View;
  43.     DualOldViewPtr    : ViewPtr;
  44.     DualRasInfo       : RasInfo;
  45.     DualCListPtr      : ARRAY[0..1] OF CprlistPtr;
  46.                         (* Copperlisten für noninterlace *)
  47.     DualSListPtr      : ARRAY[0..1] OF CprlistPtr;
  48.                         (* Copperlisten für interlace *)
  49.     GraphicsLibraryPtr: GfxBasePtr;
  50.  
  51. VAR (* Variable, die global verändert werden müssen *)
  52.     AtTheMoment          : [0..2];
  53.     DualDepth            : INTEGER; (* Anzahl der Planes pro BitMap *)
  54.     DualWidth, DualHeight: INTEGER;
  55.     AllreadyUsed         : BOOLEAN;
  56.  
  57.  
  58. PROCEDURE GetDoubleViewPort(): ViewPortPtr;
  59.  
  60.    BEGIN
  61.       RETURN (ADR(DualVPort));
  62.    END GetDoubleViewPort;
  63.  
  64.  
  65. PROCEDURE GetDrawRastPort(): RastPortPtr;
  66.  
  67.    BEGIN
  68.       RETURN (ADR(DualRastPort[AtTheMoment]));
  69.    END GetDrawRastPort;
  70.  
  71.  
  72. PROCEDURE CleanDrawBuffer;
  73.  
  74.    VAR Raster: RastPortPtr;
  75.  
  76.    BEGIN
  77.       Raster:=GetDrawRastPort();
  78.       SetAPen(Raster, 0);
  79.       SetDrMd(Raster, jam1);
  80.       RectFill(Raster, 0, 0, (DualWidth-1), (DualHeight-1));
  81.    END CleanDrawBuffer;
  82.  
  83.  
  84. PROCEDURE SwapBuffers;
  85.  
  86.    BEGIN
  87.       DualView.lofCprList:=DualCListPtr[AtTheMoment]; (* Copperlisten *)
  88.       DualView.shfCprList:=DualSListPtr[AtTheMoment]; (* austauschen  *)
  89.  
  90.       LoadView(ADR(DualView));          (* Bitplane auf Bildschirm bringen *)
  91.       WaitTOF;        (* und auf Rasterstrahl warten (verhindert 'flimmern') *)
  92.       AtTheMoment:=(AtTheMoment+1) MOD 2;(* Umschalten auf andere Bitplane zum
  93.                                             'verdeckten' zeichnen. *)
  94.    END SwapBuffers;
  95.  
  96.  
  97. PROCEDURE OpenDoubleView(leftEdge,topEdge: INTEGER;
  98.                          width, height   : INTEGER;
  99.                          depth           : INTEGER;
  100.                          viewModes       : ViewModeSet);
  101.  
  102.    VAR Bitmaps, Bitplanes: INTEGER;
  103.        NumberOfColors    : INTEGER;
  104.  
  105.    BEGIN
  106.       Assert(NOT(AllreadyUsed),
  107.              ADR("You can open only one DoubleView at the same time!"));
  108.  
  109.       NumberOfColors:=0;
  110.       DualDepth     :=(depth-1);
  111.       DualWidth     :=width;
  112.       DualHeight    :=height;
  113.  
  114.  
  115.       DualOldViewPtr:=GraphicsLibraryPtr^.actiView; (* alten View retten für
  116.                                                        Programmende *)
  117.       Assert((DualOldViewPtr#NIL),ADR("There's no old View to return to!"));
  118.  
  119.  
  120.       AllreadyUsed:=TRUE;
  121.       InitView(DualView);
  122.       InitVPort(DualVPort);
  123.  
  124.       FOR Bitmaps:=0 TO 1 DO
  125.          InitRastPort(DualRastPort[Bitmaps]);
  126.          InitBitMap(DualBitMap[Bitmaps], depth, width, height);
  127.  
  128.          FOR Bitplanes:=0 TO DualDepth DO
  129.             INC (NumberOfColors,1); (* Anzahl der Farben pro Bitplane um 2
  130.                                        erhöhen => pro Bitmap um 1 erhöhen. *)
  131.  
  132.             DualBitMap[Bitmaps].planes[Bitplanes]:=AllocRaster (width, height);
  133.             Assert((DualBitMap[Bitmaps].planes[Bitplanes]#NIL),
  134.                    ADR("Error while allocating memory for bitplanes"));
  135.          END; (* FOR *)
  136.  
  137.          DualRastPort[Bitmaps].bitMap:=ADR(DualBitMap[Bitmaps]);
  138.       END; (* FOR *)
  139.  
  140.       WITH DualView DO
  141.          viewPort:=ADR(DualVPort);
  142.          modes   :=viewModes;
  143.       END; (* WITH *)
  144.  
  145.       WITH DualVPort DO
  146.          dWidth  :=width;
  147.          dHeight :=height;
  148.          rasInfo :=ADR(DualRasInfo);
  149.          colorMap:=GetColorMap(NumberOfColors);
  150.       END; (* WITH *)
  151.  
  152.       WITH DualRasInfo DO
  153.          rxOffset:=leftEdge;
  154.          ryOffset:=topEdge;
  155.          next    :=NIL;
  156.       END; (* WITH *)
  157.  
  158.       FOR Bitmaps:=0 TO 1 DO
  159.          DualView.lofCprList:=NIL; (* Betriebssystem in die Irre führen: *)
  160.          DualView.shfCprList:=NIL; (* "Es sind noch keine Copperlisten
  161.                                        vorhanden!" *)
  162.  
  163.          DualRasInfo.bitMap:=ADR(DualBitMap[Bitmaps]);
  164.  
  165.          MakeVPort(ADR(DualView),ADR(DualVPort));
  166.          MrgCop(ADR(DualView));
  167.          DualCListPtr[Bitmaps]:=DualView.lofCprList;
  168.          DualSListPtr[Bitmaps]:=DualView.shfCprList;
  169.       END; (* FOR *)
  170.  
  171.       AtTheMoment:=1; (* Buffer2 ist aktuell *)
  172.       CleanDrawBuffer; (* Buffer2 löschen *)
  173.       SwapBuffers;     (* und auf dem Bildschirm darstellen *)
  174.    END OpenDoubleView;
  175.  
  176.  
  177. PROCEDURE CloseDoubleView;
  178.  
  179.    VAR Bitmaps, Bitplanes: INTEGER;
  180.  
  181.    BEGIN
  182.       IF (DualOldViewPtr # NIL)
  183.          THEN
  184.             LoadView(DualOldViewPtr);
  185.             WaitTOF; (* Warten, bis alter View erscheint *)
  186.       END; (* IF *)
  187.  
  188. (* ab hier werden die allozierten Speicher wieder freigegeben *)
  189.  
  190.       FreeVPortCopLists(ADR(DualVPort));
  191.       IF (DualVPort.colorMap # NIL)
  192.          THEN
  193.             FreeColorMap(DualVPort.colorMap);
  194.       END; (* IF *)
  195.  
  196.  
  197.       FOR Bitmaps:=0 TO 1 DO
  198.          FreeCprList(DualCListPtr[Bitmaps]);
  199.          FreeCprList(DualSListPtr[Bitmaps]);
  200.  
  201.          FOR Bitplanes:=0 TO DualDepth DO
  202.             IF (DualBitMap[Bitmaps].planes[Bitplanes] # NIL)
  203.                THEN
  204.                   FreeRaster(DualBitMap[Bitmaps].planes[Bitplanes],
  205.                              DualWidth,DualHeight);
  206.             END; (* IF *)
  207.          END; (* FOR *)
  208.       END; (* FOR *)
  209.  
  210.       AllreadyUsed:=FALSE;
  211.  
  212.    END CloseDoubleView;
  213.  
  214.  
  215. BEGIN
  216.    GraphicsLibraryPtr:=ADR(Graphics); (* Adresse der "graphics.library" holen *)
  217.    AllreadyUsed      :=FALSE;
  218. END DoubleBuffering.
  219.  
  220.